// h 函数：产生虚拟dom树，返回的是一个对象
import vnode from './vnode'
/**
 * 编写一个低配版的diff函数，这个函数必须接受3个参数，缺一不可
 * 相当于它的重置功能较弱
 * 也就是说，调用时必须是下面三种形态之一
 */
/**
 * 三种形态：
 *  1. h('div',{},'文字')
 *  2. h('div',{},[])
 *  3. h('div',{},h())
 */
export default function(sel, data, c) {
    // 检查参数的个数
    if (arguments.length !== 3) {
        throw new Error('对不起，h函数必须传入3个参数，我们是低配版h函数')
    }
    // 检查参数c的类型
    if (typeof c === 'string' || typeof c === 'number') {
        // 说明现在调用h函数的是形态1
        return vnode(sel, data, undefined, c, undefined)
    } else if (Array.isArray(c)) {
        // 说明现在调用h函数的是形态2
        let children = []
            // 遍历c
        for (let i = 0; i < c.length; i++) {
            // 检查c[i]必须是个对象
            if (!(typeof c[i] === 'object' && c[i].hasOwnProperty('sel')))
                throw new Error('传入的数组参数中有项不是h函数')
                    //  这里不用执行c[i]，因为你的调用语句已经有了执行
                    // 此时，只要收集好就行了
            children.push(c[i])
        }
        // 循环结束了，说明chilren收集完毕了，此时可以返回虚拟节点了，它是有children属性的
        return vnode(sel, data, children, undefined, undefined)
    } else if (typeof c === 'object' && c.hasOwnProperty('sel')) {
        // 说明现在调用h函数是形态3
        // 即：传入的c是唯一的children,不用执行c,因为调用的时候 已经执行过了
        let children = [c]
        return vnode(sel, data, children, undefined, undefined)
    } else {
        throw new Error('传入的第三个参数类型不对')
    }
}